استعمال التابع filter في مكتبة SQLAlchemy بجانب بقية التوابع والتعامل مع التواريخ
مكتبة SQLAlchemy هي واحدة من المكتبات الأكثر شيوعًا في لغة البرمجة Python التي تتيح للمطورين التعامل مع قواعد البيانات باستخدام Object Relational Mapping (ORM)، مما يعزز من قدرتهم على إدارة البيانات باستخدام كائنات Python. يُعتبر filter واحدًا من التوابع الأكثر استخدامًا في SQLAlchemy، ويعمل جنبًا إلى جنب مع مجموعة واسعة من الوظائف الأخرى لتسهيل تنفيذ الاستعلامات المختلفة. وفي هذا المقال، سنتناول بشكل موسع كيفية استعمال التابع filter في SQLAlchemy، بالإضافة إلى كيفية التعامل مع التواريخ في الاستعلامات باستخدام هذه المكتبة.
1. مقدمة عن SQLAlchemy
تعتبر SQLAlchemy مكتبة شاملة وسهلة الاستخدام للتفاعل مع قواعد البيانات العلائقية، حيث توفر عدة مستويات من التفاعل مع قاعدة البيانات مثل:
-
التفاعل مباشرة مع SQL عبر Core.
-
التفاعل باستخدام ORM عبر Declarative، الذي يتيح تحويل الجداول إلى كائنات Python بطريقة سهلة ومنظمة.
تعمل SQLAlchemy على تسهيل تحويل البيانات بين الأنماط العلائقية (التي يتم تمثيلها بواسطة الجداول في قواعد البيانات) والكائنات البرمجية في Python، مما يسمح للمطورين بكتابة استعلامات معقدة بطريقة أكثر مرونة وقوة.
2. ما هو التابع filter؟
التابع filter هو إحدى الأدوات الأساسية في SQLAlchemy لاستخراج البيانات من قاعدة البيانات بناءً على شروط معينة. يستخدم filter لتطبيق تصفية على الاستعلامات بحيث يتم جلب البيانات التي تتوافق مع شروط محددة.
3. الاستخدام الأساسي للتابع filter
يُستخدم التابع filter لتصفية النتائج بناءً على شروط مثل المساواة أو المقارنة أو الوجود وغيرها. تكون طريقة استخدام filter كالتالي:
pythonsession.query(YourModel).filter(YourModel.column == 'value').all()
في هذا المثال، يقوم التابع filter بتصفية السجلات التي يكون فيها عمود column مساويًا للقيمة المحددة. ومن الممكن أيضًا استخدام معايير متعددة داخل filter باستخدام الربط المنطقي بين الشروط.
4. العمل مع التوابع الأخرى بجانب filter
SQLAlchemy يقدم مجموعة واسعة من التوابع التي يمكن استخدامها جنبًا إلى جنب مع filter لتحسين دقة الاستعلامات وتوفير مزيد من المرونة. من هذه التوابع:
4.1. filter_by
الفرق بين filter و filter_by يكمن في طريقة الكتابة. في حين أن filter يستخدم التعبيرات الصريحة لمقارنة الأعمدة مع القيم، فإن filter_by يعتمد على المعلمات المسماة.
pythonsession.query(YourModel).filter_by(column='value').all()
filter_by هو تبسيط للتابع filter حيث أنه يتم تمرير المعاملات كأزواج من القيم، ولكن لا يدعم استخدام الدوال أو العمليات المعقدة مثل == أو >. لهذا، filter يكون أكثر مرونة عندما تحتاج إلى كتابة شروط معقدة.
4.2. join
عند العمل مع قواعد بيانات تحتوي على علاقات بين الجداول (مثل علاقة واحد لعديد أو علاقة العديد إلى العديد)، يمكن دمج filter مع join للقيام بالاستعلامات المشتركة بين الجداول.
pythonsession.query(YourModel).join(OtherModel).filter(OtherModel.column == 'value').all()
يستخدم التابع join لدمج الجداول ذات العلاقة، مما يتيح للمطورين إجراء استعلامات متقدمة تشمل عدة جداول في قاعدة البيانات.
4.3. group_by
الـ group_by هو تابع يُستخدم لتجميع النتائج بناءً على عمود أو أكثر، ومن ثم يمكن تطبيق التابع filter على النتائج المجمعة.
pythonsession.query(YourModel).group_by(YourModel.column).filter(YourModel.column == 'value').all()
هذا يعزز من قدرة SQLAlchemy على إجراء استعلامات تحليلية متقدمة، مثل إجراء حسابات جماعية أو تجميع البيانات بناءً على تصنيفات معينة.
4.4. order_by
يمكن استخدام order_by لترتيب النتائج حسب عمود معين قبل أو بعد تصفيتها باستخدام filter.
pythonsession.query(YourModel).filter(YourModel.column == 'value').order_by(YourModel.column.desc()).all()
بذلك يمكن ترتيب النتائج المتوافقة مع شروط filter بناءً على ترتيب تصاعدي أو تنازلي لأحد الأعمدة.
5. التعامل مع التواريخ في SQLAlchemy
التعامل مع التواريخ في SQLAlchemy هو أحد الموضوعات المهمة التي تحتاج إلى معرفة عميقة بكيفية معالجة البيانات الزمنية. SQLAlchemy يتيح لك إجراء عمليات استعلام متعددة باستخدام التوابع المدمجة مع التواريخ. إليك بعض الأساليب الرئيسية:
5.1. مقارنة التواريخ
من بين العمليات الأكثر شيوعًا هي مقارنة التواريخ، ويمكنك استخدام التابع filter للقيام بذلك بكل سهولة.
pythonfrom datetime import datetime
session.query(YourModel).filter(YourModel.date_column >= datetime(2023, 1, 1)).all()
في هذا المثال، يتم تصفية السجلات التي تحتوي على تاريخ أكبر من أو يساوي 1 يناير 2023.
5.2. استخدام func مع التواريخ
تسمح SQLAlchemy باستخدام الدوال المدمجة من SQLAlchemy’s func مثل year(), month(), day()، مما يسمح بمقارنة أجزاء معينة من التاريخ.
pythonfrom sqlalchemy import func
session.query(YourModel).filter(func.year(YourModel.date_column) == 2023).all()
في هذا المثال، يتم تصفية السجلات التي تحتوي على تاريخ في سنة 2023 باستخدام دالة year().
5.3. التواريخ بين فترات زمنية
غالبًا ما يتم استخدام filter لتصفية البيانات ضمن نطاقات زمنية معينة، مثل البحث عن البيانات بين تاريخين محددين.
pythonsession.query(YourModel).filter(YourModel.date_column.between(datetime(2023, 1, 1), datetime(2023, 12, 31))).all()
هذا الاستعلام يحدد السجلات التي تحتوي على تواريخ بين 1 يناير و 31 ديسمبر 2023.
5.4. استخدام timedelta
أحيانًا، قد ترغب في استخدام التواريخ بالنسبة ليوم معين باستخدام الفارق الزمني (timedelta)، مما يسمح بالقيام بحسابات زمنية مرنة.
pythonfrom datetime import timedelta
session.query(YourModel).filter(YourModel.date_column >= datetime.now() - timedelta(days=30)).all()
هنا يتم تصفية السجلات التي تحتوي على تاريخ أكبر من أو يساوي تاريخ اليوم قبل 30 يومًا.
6. الجمع بين filter مع توابع أخرى
عند التعامل مع استعلامات معقدة في SQLAlchemy، قد تحتاج إلى الجمع بين filter مع توابع أخرى لتحقيق أهدافك. على سبيل المثال، الجمع بين filter و join يمكن أن يعزز قدرتك على التعامل مع الاستعلامات عبر جداول متعددة.
pythonsession.query(YourModel).join(OtherModel).filter(YourModel.column == 'value', OtherModel.date_column >= datetime(2023, 1, 1)).all()
في هذا المثال، يتم الجمع بين filter و join لتصفية البيانات بناءً على معايير من جداول متعددة.
7. الخلاصة
التابع filter في SQLAlchemy هو أداة قوية ومرنة تُستخدم لتصفية البيانات استنادًا إلى معايير معينة. يمكن دمجه مع العديد من التوابع الأخرى مثل filter_by و join و order_by للحصول على استعلامات أكثر تعقيدًا ودقة. إضافة إلى ذلك، يوفر SQLAlchemy مجموعة من الأدوات المتقدمة للتعامل مع التواريخ مثل المقارنة بين التواريخ، استخدام func للتعامل مع أجزاء معينة من التاريخ، وكذلك الحسابات الزمنية باستخدام timedelta. هذه المزايا تجعل من SQLAlchemy خيارًا ممتازًا للتعامل مع قواعد البيانات بطريقة مرنة وعملية.

